
package jp.ize.iwp.utils;

// {{{ import
#if flash9
import flash.display.Loader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.system.Security;
#elseif flash
import flash.MovieClip;
import jp.ize.iwp.avm1.events.Event;
import jp.ize.iwp.avm1.events.IOErrorEvent;
import jp.ize.iwp.avm1.events.SecurityErrorEvent;
import jp.ize.iwp.avm1.display.Loader;
#end
import jp.ize.iwp.utils.sync.SyncManager;
import jp.ize.iwp.utils.sync.SyncUnit;
// }}}

/**
* LoaderFactory クラスです。<br />
* 同期する Loader を生成するFactoryパターンのクラスです。
* LoaderFactory で生成された Loader が全てコンプリートしたときに
* LoaderFactoryインスタンス自身に対して、SyncEvent.ALL_COMPLETE イベントが発生します。
*/
class LoaderFactory extends SyncManager
{
	// {{{ properties

	/** Loader 管理配列です。 */
	public var loaders:Array<Loader>;

	// }}}
	// {{{ public function new() :  Void
	/**
	* コンストラクタ
	*/
	public function new() :  Void
	{
		super();
		loaders = new Array();
	}

	// }}}
	// {{{ public function create() : Loader
	/**
	* 新規 Loader を生成して返します。
	*/
	public function create() : Loader
	{
		var su:SyncUnit = createSyncUnit();
		var ldr:Loader  = new Loader();
		#if flash9
		flash.Lib.current.stage.addChild( ldr );
		#end
		loaders.push(ldr);
		ldr.contentLoaderInfo.addEventListener( Event.COMPLETE,
			function (e:Event) {
				//trace("complete");
				su.done();
			}
		);
		//ldr.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, onProgress );
		ldr.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR,
			function (e:IOErrorEvent) {
				//trace("io error");
				su.error(e.toString());
			}
		);
		ldr.contentLoaderInfo.addEventListener( SecurityErrorEvent.SECURITY_ERROR,
			function (e:SecurityErrorEvent) {
				//trace("security error");
				su.error(e.toString());
			}
		);
		return ldr;
	}

	// }}}
}
